package com.autoerp.action.servico;

import java.util.ArrayList;
import java.util.List;

import org.mentawai.converter.DateConverter;
import org.mentawai.core.BaseAction;

import com.autoerp.dao.carro.CarroDAO;
import com.autoerp.dao.cliente.ClienteDAO;
import com.autoerp.dao.servico.DemandaDAO;
import com.autoerp.dao.servico.OrdemServicoDAO;
import com.autoerp.dao.servico.PecaDAO;
import com.autoerp.dao.servico.ServicoDAO;
import com.autoerp.dao.servico.ServicoPrestadoDAO;
import com.autoerp.model.carro.CarroEntity;
import com.autoerp.model.cliente.ClienteEntity;
import com.autoerp.model.funcionario.FuncionarioEntity;
import com.autoerp.model.servico.DemandaEntity;
import com.autoerp.model.servico.OrdemServicoEntity;
import com.autoerp.model.servico.PecaEntity;
import com.autoerp.model.servico.ServicoEntity;
import com.autoerp.model.servico.ServicoPrestadoEntity;

/**
 * Classe representa a ação do modulo Servico/Ordem de Servico.
 */
public class OrdemServicoAction extends BaseAction {

	private final ClienteDAO clienteDAO;
	private final CarroDAO carroDAO;
	private final PecaDAO pecaDAO;
	private final ServicoDAO servicoDAO;
	private final DemandaDAO demandaDAO;
	private final OrdemServicoDAO ordemServicoDAO;
	private final ServicoPrestadoDAO servicoPrestadoDAO;

	public OrdemServicoAction(ClienteDAO clienteDAO, CarroDAO carroDAO,
			PecaDAO pecaDAO, ServicoDAO servicoDAO, DemandaDAO demandaDAO,OrdemServicoDAO ordemServicoDAO, ServicoPrestadoDAO servicoPrestadoDAO) {

		this.clienteDAO = clienteDAO;
		this.carroDAO = carroDAO;
		this.pecaDAO = pecaDAO;
		this.servicoDAO = servicoDAO;
		this.demandaDAO = demandaDAO;
		this.ordemServicoDAO = ordemServicoDAO;
		this.servicoPrestadoDAO = servicoPrestadoDAO;
		
	}
	
	

	/**
	 * Action Adicionar OS.
	 * 
	 * @return the string
	 */
	public String adicionar() {

		if (!isPost()) {

			// Retorna a String ERROR.
			return ERROR;

		} else {

			// Obter da entrada o identificador do carro
			int id_carro = input.getInt("id_carro");

			// Buscar carro pelo seu identificador
			CarroEntity carro = new CarroEntity ();
			
			// Setar id do carro
			carro.setId_carro(id_carro);
			
			FuncionarioEntity funcionario = new FuncionarioEntity();
			funcionario.setId_funcionario(3);
			
					

			// Obter da entrada o objeto OS
			OrdemServicoEntity os = input.getObject(OrdemServicoEntity.class);

			// Setar carro na OS
			os.setCarro(carro);
			
			os.setFuncionario(funcionario);

			// Instanciar lista de objeto Demanda.
			List<DemandaEntity> listaDemandaPecas = new ArrayList<DemandaEntity>();

			// Buscar lista de pecas da sessão
			listaDemandaPecas = (List<DemandaEntity>) session
					.getAttribute("listaDemandaPecas");

			// Adicionar itens de pecas na OS
			if (listaDemandaPecas != null) {
				for (int index = 0; index < listaDemandaPecas.size(); index++) {
					os.addDemandaPeca(listaDemandaPecas.get(index));

				}
			}

			// Instanciar lista de objeto Servico prestado
			List<ServicoPrestadoEntity> listaServicosPrestados = new ArrayList<ServicoPrestadoEntity>();

			// Buscar lista de servicos prestados da sessão
			listaServicosPrestados = (List<ServicoPrestadoEntity>) session
					.getAttribute("listaDemandaServicos");

			// Adicionar itens de servicos prestados na OS
			if (listaServicosPrestados != null) {
				for (int index = 0; index < listaServicosPrestados.size(); index++) {
					os.addDemandaServico(listaServicosPrestados.get(index));

				}
			}
			
			// Salvar OS no BD
			ordemServicoDAO.salvar(os);
			
			//Salvar Demanda pecas no BD
			for (DemandaEntity itemPeca : os.getDemandaPecas()){
				demandaDAO.salvar(itemPeca);
		}
			
			//Salvar servico prestado no BD
			for (ServicoPrestadoEntity itemServicoPrestado :os.getServicosPrestados()){
				servicoPrestadoDAO.salvar(itemServicoPrestado);
		}

			return CREATED;

		}
	}

	/**
	 * Action Buscar Cliente.
	 * 
	 * @return the string
	 */
	public String buscarCliente() {

		if (!isPost()) {
			// Retorna a String ERROR.
			return ERROR;

		} else {
			// Obter da entrada o identificador da opcao escolhida
			int id_busca = input.getInt("id_busca");

			// Obter da entrada o texto a ser buscado
			String de_busca = input.getString("de_busca");

			// Instanciar o objeto cliente
			ClienteEntity cliente = new ClienteEntity();

			// Instanciar lista de objeto cliente
			List<ClienteEntity> listaClientes = clienteDAO
					.buscarCliente(cliente);
			;

			// Fazer a busca pela opcao escolhida
			switch (id_busca) {

			// Buscar por nome
			case 01:

				// Setar nome buscado no objeto cliente
				cliente.setDe_nome(de_busca);

				// Busca cliente no BD
				listaClientes = clienteDAO.buscarCliente(cliente);

				// Se a lista de clientes for null ou vazia retorna null
				if (listaClientes == null || listaClientes.isEmpty()) {

					addMessage("Cliente não encontrado!");
					return ERROR;

				} else {
					// Setar clientes no output da action
					output.setValue("listaClientes", listaClientes);
					return SUCCESS;
				}

				// Buscar por ID
			case 02:

				// Setar id buscado no objeto cliente
				cliente.setId_cliente(Integer.parseInt(de_busca));

				// Busca cliente no BD
				listaClientes = clienteDAO.buscarCliente(cliente);

				// Se a lista de clientes for null ou vazia retorna null
				if (listaClientes == null || listaClientes.isEmpty()) {

					addMessage("Cliente não encontrado!");
					return ERROR;

				} else {
					// Setar clientes no output da action
					output.setValue("listaClientes", listaClientes);
					return SUCCESS;

				}

			default:
				return ERROR;

			}

		}
	}

	/**
	 * Action Listar Clientes.
	 * 
	 * @return the string
	 */
	public String listarClientes() {
		// Instanciar lista de objeto cliente
		List<ClienteEntity> listaClientes = clienteDAO.buscarListaClientes();

		// Setar lista clientes no output da action
		output.setValue("listaClientes", listaClientes);

		return SUCCESS;

	}

	/**
	 * Action Nova Ordem de Servico.
	 * 
	 * @return the string
	 */
	public String novaOS() {

		// Obter da entrada o identificador do carro
		int id_carro = input.getInt("id_carro");

		// Obter da entrada o identificador do cliente
		int id_cliente = input.getInt("id_cliente");

		// Buscar cliente no BD
		ClienteEntity cliente = clienteDAO.buscarPorId(id_cliente);

		// Setar cliente na output da action
		output.setObject(cliente);

		// Instanciar objeto carro
		CarroEntity carro = new CarroEntity();

		// Carro não selecionado
		if (id_carro == 0) {

			// Setar cliente dono do carro
			carro.setCliente(cliente);

			// Instanciar lista de objeto carro
			List<CarroEntity> listaCarros = carroDAO.buscarCarro(carro);

			// Setar carros no output da action
			output.setValue("listaCarros", listaCarros);

			return SHOW;

			// Carro foi selecionado
		} else {

			// Buscar carro pelo seu identificador
			carro = carroDAO.buscarPorId(id_carro);

			// Setar o objeto carro na sessão do usuário
			session.setAttribute("carro", carro);

			// Setar o objeto cliente na sessão do usuário
			session.setAttribute("cliente", cliente);

			return SUCCESS;
		}

	}

	/**
	 * Action Listar Peças.
	 * 
	 * @return the string
	 */
	public String listarPecas() {
		// Instanciar lista de objeto peca
		List<PecaEntity> listaPecas = pecaDAO.buscarListaPecas();

		// Setar lista pecas no output da action via ajax
		ajax(listaPecas);

		return SUCCESS;

	}

	/**
	 * Action Exibir Peça.
	 * 
	 * @return the string
	 */
	public String exibirPeca() {

		// Obter da entrada o identificador da peça
		int id = input.getInt("id_peca");

		// Buscar peca no BD
		PecaEntity peca = pecaDAO.buscarPorId(id);

		// Setar pecas no output da action via ajax
		ajax(peca);

		return SUCCESS;

	}

	/**
	 * Action Adicionar Demanda Peça.
	 * 
	 * @return the string
	 */
	public String addDemandaPeca() {

		// Instanciar o objeto Demanda.
		DemandaEntity demandaPeca = new DemandaEntity();

		// Obter da entrada o identificador da peça
		int id_peca = input.getInt("id_peca");

		// Obter da entrada a quantidade de peça
		int nu_quat_pecas = input.getInt("nu_quat_pecas");

		// Obter da entrada o preço da peça
		float nu_preco = input.getFloat("nu_preco");

		// Buscar peca no BD
		PecaEntity peca = pecaDAO.buscarPorId(id_peca);

		// Setar a peça.
		demandaPeca.setPeca(peca);

		// Setar a quantidade de peças.
		demandaPeca.setNu_quat_pecas(nu_quat_pecas);

		// Setar o preço da peça.
		demandaPeca.setNu_preco(nu_preco);

		// Instanciar lista de objeto Demanda.
		List<DemandaEntity> listaDemandaPecas = new ArrayList<DemandaEntity>();

		// Calcula valor total demanda
		float nu_valor_demanda = (nu_preco * nu_quat_pecas);

		// Verificar se existe valor total da OS na sessão
		if (session.getAttribute("nu_valor_total") == null) {
			// Setar valor total atualizado na sessão
			session.setAttribute("nu_valor_total", nu_valor_demanda);

		} else {
			// Buscar valor total da OS na sessão
			float nu_valor_total = Float.parseFloat(session.getAttribute(
					"nu_valor_total").toString());

			// Atualiza valor total da OS
			nu_valor_total += nu_valor_demanda;

			// Setar valor total atualizado na sessão
			session.setAttribute("nu_valor_total", nu_valor_total);

		}

		// Verificar se existe lista de demanda de peças
		if (session.getAttribute("listaDemandaPecas") == null) {
			// Adicionar nova peça na lista de demandas de peças
			listaDemandaPecas.add(demandaPeca);

			// Setar lista de demanda de peças na sessão
			session.setAttribute("listaDemandaPecas", listaDemandaPecas);

			// Setar demanda de pecas no output da action via ajax
			ajax(listaDemandaPecas);
			return SUCCESS;
		} else {

			// Buscar lista de pecas da sessão
			listaDemandaPecas = (List<DemandaEntity>) session
					.getAttribute("listaDemandaPecas");

			// Adicionar nova peça na lista de demandas de peças
			listaDemandaPecas.add(demandaPeca);

			// Setar lista de demanda de peças na sessão
			session.setAttribute("listaDemandaPecas", listaDemandaPecas);

			// Setar lista de demanda de pecas no output da action via ajax
			ajax(listaDemandaPecas);

			return SUCCESS;
		}

	}

	/**
	 * Action Excluir item Demanda Peça.
	 * 
	 * @return the string
	 */
	public String excluirItemDemandaPeca() {
		// Instanciar o objeto Demanda.
		DemandaEntity demandaPeca = new DemandaEntity();

		// Obter lista de demanda de peças da sessão.
		List<DemandaEntity> listaDemandaPecas = (List<DemandaEntity>) session
				.getAttribute("listaDemandaPecas");

		// Obter da entrada o numero do item da lista de demanda de peças a ser
		// excluido
		int nu_item = input.getInt("nu_item");

		// Obter o item da demanda da lista de demandas de pecas
		demandaPeca = listaDemandaPecas.get(nu_item);

		// Get numero de pecas
		int nu_quat_pecas = demandaPeca.getNu_quat_pecas();

		// Get preco da peca
		float nu_preco = demandaPeca.getNu_preco();

		// Calcula valor total demanda
		float nu_valor_demanda = (nu_preco * nu_quat_pecas);

		// Buscar valor total da OS na sessão
		float nu_valor_total = Float.parseFloat(session.getAttribute(
				"nu_valor_total").toString());

		// Atualiza valor total da OS
		nu_valor_total -= nu_valor_demanda;

		// Excluir item da lista de demanda de pecas
		listaDemandaPecas.remove(nu_item);

		// Setar lista de demanda de peças na sessão
		session.setAttribute("listaDemandaPecas", listaDemandaPecas);

		// Setar valor total atualizado na sessão
		session.setAttribute("nu_valor_total", nu_valor_total);

		// Setar lista de demanda de pecas no output da action via ajax
		ajax(listaDemandaPecas);

		return SUCCESS;
	}

	/**
	 * Action Listar Servicos.
	 * 
	 * @return the string
	 */
	public String listarServicos() {
		// Instanciar lista de objeto servico
		List<ServicoEntity> listaServicos = servicoDAO.buscarListaServicos();

		// Setar lista servicos no output da action via ajax
		ajax(listaServicos);

		return SUCCESS;

	}

	/**
	 * Action Exibir Servico.
	 * 
	 * @return the string
	 */
	public String exibirServico() {

		// Obter da entrada o identificador do servico
		int id = input.getInt("id_servico");

		// Buscar servico no BD
		ServicoEntity servico = servicoDAO.buscarPorId(id);

		// Setar servico no output da action via ajax
		ajax(servico);

		return SUCCESS;

	}

	/**
	 * Action Adicionar Demanda Servico.
	 * 
	 * @return the string
	 */
	public String addDemandaServico() {

		// Instanciar o objeto Servico prestado.
		ServicoPrestadoEntity servicoPrestado = new ServicoPrestadoEntity();

		// Obter da entrada o identificador do servico
		int id_servico = input.getInt("id_servico");

		// Obter da entrada o preço do servico
		float nu_preco = input.getFloat("nu_preco");

		// Buscar servico no BD
		ServicoEntity servico = servicoDAO.buscarPorId(id_servico);

		// Setar a servico
		servicoPrestado.setServico(servico);

		// Setar o preço do servico
		servicoPrestado.setNu_preco(nu_preco);

		// Instanciar lista de objeto Servico prestado
		List<ServicoPrestadoEntity> listaServicosPrestados = new ArrayList<ServicoPrestadoEntity>();

		// Verificar se existe valor total da OS na sessão
		if (session.getAttribute("nu_valor_total") == null) {
			// Setar valor total atualizado na sessão
			session.setAttribute("nu_valor_total", nu_preco);

		} else {
			// Buscar valor total da OS na sessão
			float nu_valor_total = Float.parseFloat(session.getAttribute(
					"nu_valor_total").toString());

			// Atualiza valor total da OS
			nu_valor_total += nu_preco;

			// Setar valor total atualizado na sessão
			session.setAttribute("nu_valor_total", nu_valor_total);

		}

		// Verificar se existe lista de demanda de peças
		if (session.getAttribute("listaDemandaServicos") == null) {
			// Adicionar novo servico na lista de servicos prestados
			listaServicosPrestados.add(servicoPrestado);

			// Setar lista de servicos prestados na sessão
			session.setAttribute("listaDemandaServicos", listaServicosPrestados);

			// Setar lista de servicos prestados no output da action via ajax
			ajax(listaServicosPrestados);
			return SUCCESS;
		} else {

			// Buscar lista de servicos prestados da sessão
			listaServicosPrestados = (List<ServicoPrestadoEntity>) session
					.getAttribute("listaDemandaServicos");

			// Adicionar novo servico prestado na lista de servicos prestados
			listaServicosPrestados.add(servicoPrestado);

			// Setar lista de servicos prestados na sessão
			session.setAttribute("listaDemandaServicos", listaServicosPrestados);

			// Setar lista de servicos prestados no output da action via ajax
			ajax(listaServicosPrestados);

			return SUCCESS;
		}

	}

	/**
	 * Action Excluir item Demanda Servico.
	 * 
	 * @return the string
	 */
	public String excluirItemDemandaServico() {
		// Instanciar o objeto Servico prestado.
		ServicoPrestadoEntity servicoPrestado = new ServicoPrestadoEntity();

		// Obter lista de servicos prestados da sessão
		List<ServicoPrestadoEntity> listaServicosPrestados = (List<ServicoPrestadoEntity>) session
				.getAttribute("listaDemandaServicos");

		// Obter da entrada o numero do item da lista de servicos prestados a
		// ser
		// excluido
		int nu_item = input.getInt("nu_item");

		// Obter o item do servico prestado da lista de servicos prestados
		servicoPrestado = listaServicosPrestados.get(nu_item);

		// Get preco do servico
		float nu_preco = servicoPrestado.getNu_preco();

		// Buscar valor total da OS na sessão
		float nu_valor_total = Float.parseFloat(session.getAttribute(
				"nu_valor_total").toString());

		// Atualiza valor total da OS
		nu_valor_total -= nu_preco;

		// Excluir item da lista de servicos prestados
		listaServicosPrestados.remove(nu_item);

		// Setar lista de servicos prestados na sessão
		session.setAttribute("listaDemandaServicos", listaServicosPrestados);

		// Setar valor total atualizado na sessão
		session.setAttribute("nu_valor_total", nu_valor_total);

		// Setar lista de demanda de pecas no output da action via ajax
		ajax(listaServicosPrestados);

		return SUCCESS;
	}
	

	/**
	 * Action Listar OS.
	 * 
	 * @return the string
	 */
	public String listarOS() {
		// Instanciar lista de objeto cliente
		//List<OrdemServicoEntity> listaOS = ordemServicoDAO.buscarListaOS();
		
		
		// Setar lista de OS no output da action
		//output.setValue("listaOS", listaOS);
		
		return SUCCESS;

		
	}

}
